今日目標
如何跟路由溝通,在第 20 天時有介紹過如何使用
今天帶各位新增一個路由,並在畫面顯示結果
首先在模組根目錄增加 controller 的資料夾
接著新增 [main.py](http://main.py) ,並輸入底下內容
# ironman_js/controller/main.py
# -*- encoding: utf-8 -*-
from odoo.http import route, Controller, request
class Main(Controller):
    @route('/ironman/data/sale_total', type='json', auth="user")
    def sale_total(self):
        orders = request.env['sale.order'].sudo().search([])
        return {
            'total': sum(order.amount_total for order in orders),
        }
老樣子,有增加 python 檔案,就是要向 __init__.py 註冊
# ironman_js/controller/__init__.py
# -*- encoding: utf-8 -*-
from . import main
# ironman_js/__init__.py
# -*- encoding: utf-8 -*-
from . import models
from . import controller
接著調整模板,在 table 的下方加入內容
<!-- ironman_js/static/src/xml/action_view.xml -->
<hr/>
<div>
    <h3>銷售總額: <t t-esc="widget.soAmountTotal"/></h3>
</div>
接著回頭調整 JS,在 willStart 階段增加一個 _rpc 來向路由發出請求
這裡直接提供整個函式,各位可以自行前後比較一下
willStart: async function () {
    let def = this._super(...arguments);
    let dataPromise = this._rpc({
        model: 'todo.list',
        method: 'get_self_todo_list',
        args: [[]],
    });
    let amountPromise = this._rpc({
        route: '/ironman/data/sale_total',
    });
    let [defReturn, data, amount] = await Promise.all([def, dataPromise, amountPromise]);
    this.todoList = data || [];
    this.soAmountTotal = amount.total || 0;
    return defReturn;
},
完成後重新啟動伺服器,重新整理網頁後就能看到結果囉
